// 注意：需要同时导入Parser trait和其derive宏
use clap::Parser;

mod config;
mod entry;
mod models;
mod search;
mod view;

use anyhow::{Context, Result};
use clap::Subcommand;
use dumbo_config::load_config;
use models::Config;
use std::env;
use std::path::Path;

// todo: 这个Command的配置中，没有输出版本信息，我希望通过docsearch -V
// 能够看到当前应用的版本信息，这个版本信息是从Cargo.toml中读取的
/// 应用名称常量，统一管理
const APP_NAME: &str = "docsearch";

/// 文档搜索工具
#[derive(Parser, Debug)]
#[command(name = APP_NAME)]
#[command(about = "文档搜索工具", long_about = None)]
#[command(version = env!("CARGO_PKG_VERSION"))]  // 从Cargo.toml读取版本信息
struct Cli {
    #[command(subcommand)]
    command: Commands,
}

#[derive(Debug, Subcommand)]
enum Commands {
    /// 搜索文档并将结果保存到.search文件
    Search {
        /// 搜索关键字
        keyword: String,
    },
    /// 查看.search文件中的条目
    View {
        /// 显示指定条目的详细信息
        #[arg(short, long)]
        index: Option<usize>,
        /// 打开指定条目对应的文件
        #[arg(short, long)]
        open: Option<usize>,
    },
}

fn main() -> Result<()> {
    // 从应用名称推导日志文件路径
    let log_filename = format!("{}.log", APP_NAME);
    let log_path = Path::new(&log_filename);

    // 使用默认前缀初始化日志，通过环境变量DUMBO_LOG_LEVEL来设置LevelFilter
    dumbo_log::init_log(log_path, None)?;
    let cli = Cli::parse();
    let config = load_config::<Config>().context("配置文件加载失败")?;
    let working_dir = env::current_dir().context("获取当前工作目录失败")?;

    match cli.command {
        Commands::Search { keyword } => {
            search::search_documents(&keyword, &working_dir)?;
            view::view_entries(None, None, &config, &working_dir)?;
        }
        Commands::View { index, open } => {
            view::view_entries(index, open, &config, &working_dir)?;
        }
    }

    Ok(())
}